package examples;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

public class MyExample {

    public static void main(String[] args) throws Exception {

        File fileDir = new File("");

        HttpServletRequest req = null;

        String realPath = "";

        //1、创建DiskFileItemFactory
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setRepository(fileDir);

        //2、创建ServletFileUpload
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");

        //3、判断enctype:判断提交上来的数据是否是上传表单的数据
        if(!ServletFileUpload.isMultipartContent(req)){
            System.out.println("不是上传文件，终止");
            //按照传统方式获取数据
            return;
        }

        //4、使用ServletFileUpload解析器解析上传数据，解析结果返回的是一个List<FileItem>集合，每一个FileItem对应一个Form表单的输入项
        List<FileItem> items = upload.parseRequest(req);
        for(FileItem item:items){
            //如果fileitem中封装的是普通输入项的数据（输出名、值）
            if(item.isFormField()){
                String filedName = item.getFieldName();//普通输入项数据的名
                //解决普通输入项的数据的中文乱码问题
                String filedValue = item.getString("UTF-8");//普通输入项的值
                System.out.println("普通字段:"+filedName+"=="+filedValue);
            }else{
                //如果fileitem中封装的是上传文件，得到上传的文件名称，
                String fileName = item.getName();//上传文件的名
                //多个文件上传输入框有空 的 异常处理
                if(fileName==null||"".equals(fileName.trim())){  //去空格是否为空
                    continue;// 为空，跳过当次循环，  第一个没输入则跳过可以继续输入第二个
                }

                //注意：不同的浏览器提交的文件名是不一样的，有些浏览器提交上来的文件名是带有路径的，
                //如：   c:\a\b\1.txt，而有些只是单纯的文件名，如：1.txt
                //处理上传文件的文件名的路径，截取字符串只保留文件名部分。
                //截取留最后一个"\"之后，+1截取向右移一位（"\a.txt"-->"a.txt"）
                fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
                //拼接上传路径。存放路径+上传的文件名
                String filePath = realPath+"\\"+fileName;
                //构建输入输出流
                InputStream in = item.getInputStream(); //获取item中的上传文件的输入流
                OutputStream out = new FileOutputStream(filePath); //创建一个文件输出流

                //创建一个缓冲区
                byte b[] = new byte[1024];
                //判断输入流中的数据是否已经读完的标识
                int len = -1;
                //循环将输入流读入到缓冲区当中，(len=in.read(buffer))！=-1就表示in里面还有数据
                while((len=in.read(b))!=-1){  //没数据了返回-1
                    //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
                    out.write(b, 0, len);
                }
                //关闭流
                out.close();
                in.close();
                //删除临时文件
                item.delete();//删除处理文件上传时生成的临时文件
                System.out.println("文件上传成功");
            }
        }

    }

}
